package cn.com.surker.production.dao;

import cn.com.surker.production.entity.ProductionIndent;
import cn.com.surker.production.entity.ProductionInvoice;
import cn.com.surker.production.entity.report.ProductionIndentReport;
import cn.com.surker.production.entity.report.ProductionInvoiceReport;
import cn.com.surker.production.entity.vo.ProductionInvoiceVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 生产发货单表 Mapper 接口
 * </p>
 *
 * @author admin
 * @since 2024-07-25
 */
public interface ProductionInvoiceDao extends BaseMapper<ProductionInvoice> {

	/**
	 * 查询全部信息
	 *
	 * @param dbCode
	 * @param invPage
	 * @param qw
	 * @return
	 */
	Page<ProductionInvoiceVo> selectFull(String dbCode, Page<ProductionInvoice> invPage, @Param(Constants.WRAPPER) QueryWrapper<ProductionInvoice> qw);

	List<ProductionInvoiceVo> selectFull(String dbCode, @Param(Constants.WRAPPER) QueryWrapper<ProductionInvoice> qw);

	/**
	 * 查询发货单的详细信息,不包含转入转出
	 * @param dbCode        erp的数据库
	 * @param id
	 * @return
	 */
	ProductionInvoiceVo queryOverview(String dbCode, Long id);

	/**
	 * 根据openid查询发货单的详细信息,不包含转入转出
	 * @param dbCode        erp的数据库
	 * @param carId
	 * @return
	 */
	ProductionInvoiceVo queryOverviewOpenid(String dbCode, String openid, Long carId);

	/**
	 * 包含退回,转入转出,作废
	 *
	 * @param dbCode
	 * @param qw
	 * @return
	 */
	IPage<ProductionInvoiceVo> invoiceDetail(IPage<ProductionIndentReport> page, String dbCode, @Param(Constants.WRAPPER) QueryWrapper<ProductionInvoice> qw);

	List<ProductionInvoiceVo> invoiceDetail(String dbCode, @Param(Constants.WRAPPER) QueryWrapper<ProductionInvoice> qw);

	/**
	 * 根据任务单查询发货单
	 *
	 * @param indentId
	 * @return
	 */
	List<ProductionInvoice> findByIndent(String dbCode, Long indentId);

	/**
	 * 发货单列表数据
	 *
	 * @param dbCode     数据库
	 * @param startTime 起始时间
	 * @param endTime   截止时间
	 * @return
	 */
	List<ProductionInvoiceVo> findList(String dbCode, String startTime, String endTime);

	/**
	 * 技术部开盘鉴定台账
	 * @return
	 */
	IPage<ProductionInvoiceReport> findLabIndentReport(IPage<ProductionIndentReport> page, String dbCode, String startTime, String endTime, @Param(Constants.WRAPPER) QueryWrapper<ProductionIndent> qw);

	/**
	 * 计算开盘鉴定汇总
	 * @param dbCode
	 * @param startTime
	 * @param endTime
	 * @param qw
	 * @return
	 */
	ProductionInvoiceReport findLabIndentSum(String dbCode, String startTime, String endTime, @Param(Constants.WRAPPER) QueryWrapper<ProductionIndent> qw);
	/**
	 * 技术开盘鉴定台账
	 * @param dbCode
	 * @param startTime
	 * @param endTime
	 * @param qw
	 * @return
	 */
	List<ProductionInvoiceReport> findLabIndentReport(String dbCode, String startTime, String endTime, @Param(Constants.WRAPPER) QueryWrapper<ProductionIndent> qw);

	/**
	 * 量差数据
	 *
	 * @param page
	 * @param dbCode
	 * @param qw
	 * @return
	 */
	IPage<ProductionInvoiceVo> diffStere(Page<ProductionInvoiceVo> page, String dbCode, @Param(Constants.WRAPPER) QueryWrapper<ProductionInvoiceVo> qw);

	/**
	 * 量差数据
	 *
	 * @param dbCode
	 * @param qw
	 * @return
	 */
	List<ProductionInvoiceVo> diffStere(String dbCode, @Param(Constants.WRAPPER) QueryWrapper<ProductionInvoiceVo> qw);

	/**
	 * 查询发货单的运输方量
	 *
	 * @param invoiceId
	 * @return
	 */
	ProductionInvoiceVo queryTranStere(Long invoiceId);

	/**
	 * 按小时查询泵送方量
	 * @param startTime
	 * @param endTime
	 * @return hours 小时数 pumpStere 泵送量 operateStere转料量
	 */
	List<Map<String, Object>> findHoursPumpStere(String dbCode,String startTime, String endTime);

	/**
	 * 按小时查询发货、签收方量
	 * @param startTime
	 * @param endTime
	 * @return hours 小时数 sendStere 发货量 signStere 签收
	 */
	List<Map<String, Object>> findHoursSendStere(String dbCode, String startTime, String endTime);

	/**
	 * 首页查询车辆排名
	 * @param startTime
	 * @param endTime
	 * @return sendStere 发货量 tranNo 车次 distance 运距 carCode 自编号 carNo 车牌号 pumpStere 泵送量
	 */
	List<Map<String, Object>> findTopCarStere(String startTime, String endTime);

	/**
	 * 查询生产线生产量、泵送量
	 * @param startTime
	 * @param endTime
	 * @return id 生产线id name 生产线名称 proStere 生产量 pumpStere 泵送量
	 */
	List<Map<String, Object>> findLineProStere(String startTime, String endTime);

	/**
	 * 查询项目发货进度信息
	 * @param startTime
	 * @param endTime
	 * @return site 浇筑部位 startTime 开盘时间(mm月dd日 hh时mm分) planState 计划方量 type 任务单状态
	 * sendStere 发货方量 conName 工程名称 openTime 开始时间
	 */
	List<Map<String, Object>> findContractProgress(String startTime, String endTime);

	/**
	 * 查询生产强度占比
	 * @param startTime
	 * @param endTime
	 * @return sendStere 发货方量 strengthId 强度ID level 强度等级(如果为空则用strength) strength 强度等级名称
	 */
	List<Map<String, Object>> findStrengthProportion(String startTime, String endTime);

	/**
	 * 驾驶员运输台账
	 * @param dbCode
	 * @param openid
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	List<Map<String, Object>> queryTransport(String dbCode, String openid, String startTime, String endTime);

	/**
	 * 加载驾驶员运输汇总
	 * @param dbCode
	 */
	ProductionInvoiceVo loadDriverAchievement(String dbCode, String openid, String startTime, String endTime);

	/**
	 * 查询审核信息
	 *
	 * @param dbCode
	 * @param objectPage
	 * @param qw
	 * @return
	 */
	Page<ProductionInvoiceVo> selectExaminePage(String dbCode, Page<ProductionInvoice> objectPage, @Param(Constants.WRAPPER) QueryWrapper<ProductionInvoice> qw);

	/**
	 * 查询销售日产值表,和普通列表不同的是,需要将退砼列表分开显示
	 *
	 * @param dbCode
	 * @param qw
	 * @return
	 */
	List<ProductionInvoiceVo> selectDayValueList(String dbCode, @Param(Constants.WRAPPER) QueryWrapper<ProductionInvoice> qw);

	/**
	 * 查询合同的发货方量
	 *
	 * @param dbCode
	 * @param conId
	 * @return
	 */
	Double queryConSendStere(String dbCode, Long conId);

	/**
	 * 查询合同的退回方量
	 *
	 * @param dbCode
	 * @param conId
	 * @return
	 */
	Double queryConBakStere(String dbCode, Long conId);

	/**
	 * 查询生产方量
	 *
	 * @param dbCode
	 * @param invoiceId
	 * @return
	 */
	Double queryProStere(String dbCode, Long invoiceId);

	/**
	 * 查询工控机生产方量
	 *
	 * @param dbCode
	 * @param invoiceId
	 * @return
	 */
	Double queryControlStere(String dbCode, Long invoiceId);

	/**
	 * 查询发货单的累计数据
	 *
	 * @param indentId
	 * @return
	 */
	Map<String, Object> queryTotalStere(String dbCode, Long indentId);

	/**
	 * 查询运输车辆列表
	 *
	 * @param dbCode
	 * @param indentId
	 * @return
	 */
	List<String> findTranCar(String dbCode, Long indentId);
	/**统计运输车次**/
	Integer findCloudTrain(String dbCode, String startTime, String endTime);

	Map<String, Double> overviewTotal(String dbCode, @Param(Constants.WRAPPER) QueryWrapper<ProductionInvoice> qw);

	/**
	 * 查询盘方量缺失的发货单
	 *
	 * @param startTime
	 * @param endTime
	 * @return
	 */
	List<ProductionInvoice> findNoBatchInv(String startTime, String endTime);

	/**
	 * 查询旧的发货方量
	 * 仅用于初次同步
	 *
	 * @return
	 */
	@Deprecated
	List<ProductionInvoice> findTotalStere();

	/**
	 * 查询没有泵送设备的发货单
	 * 仅用于初次同步
	 *
	 * @return
	 */
	@Deprecated
	List<ProductionInvoice> findNoPumpList();

	/**
	 * 查询任务单使用的泵送设备
	 * 仅用于初次同步
	 *
	 * @return
	 */
	@Deprecated
	Map<String, Object> findIndentPump(Long indentId);

	/**
	 * 查询浇筑方式为默认的浇筑方式的发货单列表
	 *
	 * @return
	 */
	List<ProductionInvoice> defaultPumpList(Long indentId);

	ProductionInvoiceVo findPumpCodeDetail(String dbCode, Long id);
}
